From: Aron Xu <aron@debian.org>
Date: Mon, 13 Feb 2012 15:38:15 +0800
Subject: verbose numeric port

---
 netcat.c |   59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 55 insertions(+), 4 deletions(-)

diff --git a/netcat.c b/netcat.c
index baab909..eb3453e 100644
--- a/netcat.c
+++ b/netcat.c
@@ -41,6 +41,7 @@
 #include <netinet/tcp.h>
 #include <netinet/ip.h>
 #include <arpa/telnet.h>
+#include <arpa/inet.h>
 
 #ifndef IPTOS_LOWDELAY
 # define IPTOS_LOWDELAY 0x10
@@ -424,6 +425,18 @@ main(int argc, char *argv[])
 				s = local_listen(host, uport, hints);
 			if (s < 0)
 				err(1, NULL);
+
+			char* local;
+			if (family == AF_INET6
+				local = "0.0.0.0";
+			else if (family == AF_INET)
+				local = ":::";
+			else
+				local = "unknown"
+			fprintf(stderr, "Listening on [%s] (family %d, port %d)\n",
+				host ?: local,
+				family,
+				*uport);
 			/*
 			 * For UDP, we will use recvfrom() initially
 			 * to wait for a caller, then use the regular
@@ -432,16 +445,15 @@ main(int argc, char *argv[])
 			if (uflag) {
 				int rv, plen;
 				char buf[16384];
-				struct sockaddr_storage z;
 
-				len = sizeof(z);
+				len = sizeof(cliaddr);
 				plen = jflag ? 16384 : 2048;
 				rv = recvfrom(s, buf, plen, MSG_PEEK,
-				    (struct sockaddr *)&z, &len);
+				    (struct sockaddr *)&cliaddr, &len);
 				if (rv < 0)
 					err(1, "recvfrom");
 
-				rv = connect(s, (struct sockaddr *)&z, len);
+				rv = connect(s, (struct sockaddr *)&cliaddr, len);
 				if (rv < 0)
 					err(1, "connect");
 
@@ -450,6 +462,45 @@ main(int argc, char *argv[])
 				len = sizeof(cliaddr);
 				connfd = accept(s, (struct sockaddr *)&cliaddr,
 				    &len);
+				if(vflag) {
+				/* Don't look up port if -n. */
+					if (nflag)
+						sv = NULL;
+					else
+						sv = getservbyport(ntohs(atoi(uport)),
+							uflag ? "udp" : "tcp");
+
+					if (((struct sockaddr *)&cliaddr)->sa_family == AF_INET) {
+						char dst[INET_ADDRSTRLEN];
+						inet_ntop(((struct sockaddr *)&cliaddr)->sa_family,&(((struct sockaddr_in *)&cliaddr)->sin_addr),dst,INET_ADDRSTRLEN);
+						fprintf(stderr, "Connection from [%s] port %s [%s/%s] accepted (family %d, sport %d)\n",
+							dst,
+							uport,
+							uflag ? "udp" : "tcp",
+							sv ? sv->s_name : "*",
+							((struct sockaddr *)(&cliaddr))->sa_family,
+							ntohs(((struct sockaddr_in *)&cliaddr)->sin_port));
+					}
+					else if(((struct sockaddr *)&cliaddr)->sa_family == AF_INET6) {
+						char dst[INET6_ADDRSTRLEN];
+						inet_ntop(((struct sockaddr *)&cliaddr)->sa_family,&(((struct sockaddr_in6 *)&cliaddr)->sin6_addr),dst,INET6_ADDRSTRLEN);
+						fprintf(stderr, "Connection from [%s] port %s [%s/%s] accepted (family %d, sport %d)\n",
+							dst,
+							uport,
+							uflag ? "udp" : "tcp",
+							sv ? sv->s_name : "*",
+							((struct sockaddr *)&cliaddr)->sa_family,
+							ntohs(((struct sockaddr_in6 *)&cliaddr)->sin6_port));
+					}
+					else {
+						fprintf(stderr, "Connection from unknown port %s [%s/%s] accepted (family %d, sport %d)\n",
+							uport,
+							uflag ? "udp" : "tcp",
+							sv ? sv->s_name : "*",
+							((struct sockaddr *)(&cliaddr))->sa_family,
+							ntohs(((struct sockaddr_in *)&cliaddr)->sin_port));
+					}
+				}
 				readwrite(connfd);
 				close(connfd);
 			}
-- 
